Formatierte Strings in Assembler Welcher Assemblerprogrammierer hat nicht schon neidisch auf die Kollegen aus der C-Ecke geschaut, wenn es um formatierte Strings geht. »FormatStr.asm« macht dem nun ein Ende. Es handelt sich dabei um eine kleine Routine, die die Funktion »RawDoFmt()« aufruft. Diese unterstützt allerdings nicht alle C-spezifischen Format-Codes; es werden keine Fließkomma und Oktalzahlen unterstützt. Folgende Codes können benutzt werden: (1) %c - Das nächste Argument in der Liste wird als ein Buchstabe interpretiert. Dieser wird anstelle des %c eingesetzt. (2) %d - Das nächste Argument in der Liste wird als Dezimalzahl mit Vorzeichen interpretiert. Diese wird anstelle des %d eingesetzt. (3) %x - Das nächste Argument in der Liste wird als Hexadezimalzahl interpretiert. Diese wird anstelle des %x eingesetzt. (4) %s - Das nächste Argument in der Liste wird als Zeiger auf einen mit einem NULL Byte beendeten String interpretiert. Dieser wird anstelle des %s eingesetzt. Wenn Sie vor den Format Code ein 'l' setzen (zum Beispiel %lx) wird das zugehörige Argument als longword interpretiert. Es können auch die folgende Zeichen in den Format Code eingefügt werden: (1) Ein Minuszeichen bewirkt, daß das entsprechende Argument linksbündig in den String eingesetzt wird. (zum Beispiel %-d) (2) Eine Zahl bestimmt die maximale größe des Feldes. Was darüber hinaus geht wird abgeschnitten (zum Beispiel %5d). Eine führende 0 bewirkt bei einem String, daß wenn der String kleiner als die bestimmte Feldgröße ist, alle fehlenden Zeichen durch Leerzeichen ersetzt werden (zum Beispiel %019s). Bei Zahlen werden fehlende Ziffern durch Nullen ersetzt (zum Beispiel %08x). Die Argumentenübergabe gestaltet sich etwas kompliziert. Da man ja mehr als 7 Argumente übergeben kann, fallen die Adressregister als Übergabemöglichkeiten weg. Wir wählen den Weg über den Stack. Das geht folgendermaßen: Sie haben zum Beispiel folgenden zu formatierenden String: "Mein Name ist: %s. Ich bin %d Jahre alt" Jetzt müssen die Argumente von hinten nach vorne auf den Stack gelegt werden. Zuerst muß also das Alter auf den Stack: move.w #120,-(a7) Und dann der Name: pea Name Wobei Name mit dc.b definiert werden muß und mit einem NULL Byte endet: Name: dc.b "Ottokar",0 Jetzt liegen alle Argumente in der richtigen Reihenfolge auf dem Stack. Nun kann, wenn alle anderen Parameter angegeben sind (siehe Listing) aufgerufen werden. Nach Beendigung der Routine muß der Stac k wieder korrigiert werden. Um wieviel Bytes, hängt davon ab wieviel Argumente daraufgelegt wurden. In unserem Fall wurde er um 6 Bytes niedriger (move.w = 2 Bytes (WORD) pea = 4 Bytes (LONGWORD)). Nun muß er also auch wieder um 6 Byte erhöht werden: lea 6(a7),a7 Er hat nun wieder den alten Wert. Würde das vergessen, kämen die ganzen Rücksprungadressen durcheinander, was irgendwann einen Freiflug nach Indien heraufbeschwört. Das Listing FormatDemo.asm soll nur als Beispiel dienen. Wichtig ist die Routine FormatStr. Das Programm läßt sich mit dem A68k (Fish 521) und Blink (Fish 351) übersetzen: A68K Format.asm Blink Format.o